#include "ugui_key.h"
#include "tm1638.h"
#include "delay.h"
#include "IM6103.h"
#include "relay.h"
#include "beep.h"

#include "ugui.h"
#include "ugui_lcd_app.h"


LED_TypeDef LedValue = {0};  //保存led灯

KEY_TypeDef KeyValue = {0};  //保存按键值

uint8_t keytime = 0;         //按键扫描时间

keydis_t keydis = {0};

 //TM1638_keytime_handle  扫描按键
void TM1638_keytime_handle(void)  
{
    keytime ++;   //定时扫描按键
    
    if(keydis.PressFlg == true)
    {
        //按键按下计时
        keydis.cnt++;
    }
}  

uint16_t Feisuo_process_Return(uint16_t min, uint16_t max, uint16_t num)   //循环
{
    if  ((num+keydis.UpCnt-keydis.DnCnt)<min)
        num = max;
    else if ((num+keydis.UpCnt-keydis.DnCnt)>max)
        num = min;
    else
        num = num+keydis.UpCnt-keydis.DnCnt;
    
    keydis.UpCnt=0;
    keydis.DnCnt=0;
    return(num);
}

uint16_t Feisuo_process(uint16_t min, uint16_t max, uint16_t num)            //不循环
{
    if((num+keydis.UpCnt-keydis.DnCnt)<min)
        num = min;
    else if ((num+keydis.UpCnt-keydis.DnCnt)>max)
        num = max;
    else
        num = num+keydis.UpCnt-keydis.DnCnt;
    keydis.UpCnt=0;
    keydis.DnCnt=0;
    return(num);
}

void  uGui_KEY_SCAN(void)
{
    KeyValue.HEX_32 = TM1638_Read_Key();           //实时读取
    
    if( KeyValue.HEX_32 )
    {
        //按键  ---》》》》按下
        if( KeyValue.HEX_32 == keydis.KeyVal)
        {
            keydis.PressStatus = true;                  //按下状态
            keydis.PressFlg = true;                     //按下标志位
            if ( keydis.cnt > LONG_TIME)
            {
                keydis.ProEvent = true;
                keydis.KeyStatus = LONG_ENTER;          //长按状态
            }
            else
            {
               keydis.KeyStatus = SHORT_ENTER;          //短按状态
               keydis.ProEvent = true;                 //还没处理,置按键处理标记
            }
        }            
        else{            
            keydis.KeyVal = KeyValue.HEX_32;
        }
    }else{
          //按键  ---》》》》弹起
         if (keydis.PressFlg == true)
         {
            if (keydis.cnt>=LONG_TIME)
            {
               keydis.KeyStatus = NONE_ENTER;
               keydis.ProEvent = false;                 //已经处理完一次
            }
            else
            {
               keydis.KeyStatus = SHORT_ENTER;          //短按状态
               keydis.ProEvent = true;                 //还没处理,置按键处理标记
            }
            keydis.PressStatus = false;               //弹起
         }
         else
         {
            keydis.KeyStatus = NONE_ENTER;
            keydis.FirPre = true;
            keydis.ProEvent = false;
         }
         keydis.PressFlg = false;
         keydis.cnt = 0;      
    }
}

//Key_Set_Parameter  按键 设置处理事件
void Key_Set_TouchUpdate(UG_OBJECT* obj)
{
    UG_TOUCH ug_setkey = {0};
    if(keydis.PressStatus){
        //按键按下
        ug_setkey.xp = 10 + obj->a_abs.xs; 
        ug_setkey.yp = 10 + obj->a_abs.ys; 
        UG_TouchUpdate ( ug_setkey.xp , ug_setkey.yp , TOUCH_STATE_PRESSED ) ;
     
    }else{
        //弹起来   释放
        UG_TouchUpdate ( -1 , -1 , TOUCH_STATE_RELEASED ) ;
    }
}
//Key_Set_Parameter  按键 设置处理事件
void Key_Set_Parameter(void)
{
    if(keydis.KeyStatus == SHORT_ENTER)
    {
        switch(lcd_ugui.FuncID)
        { 
            case BIOS_UI :             //开机界面
            case SELF_TEST :           //自检参数设置
            case MAIN_UI :             //主界面
            {
                lcd_ugui.SysCnt = 0;
                window_system_ui_select(lcd_ugui.SysCnt);
                UG_WindowShow( &window_system_ui );
                UG_Update_time_Set(0);
                lcd_ugui.FuncID = SYS_MENU ;
            }break;
            case SYS_MENU  :        //系统参数设置
            {
                Key_Set_TouchUpdate(&object_system_ui[lcd_ugui.SysCnt]);
            }break; 
            case ALARM_UI :          //告警
            {

            }break;
            
            case SYS_UART:          // 设置串口参数
            {
                Key_Set_TouchUpdate(&object_system_uart_ui[lcd_ugui.SysCnt]);                
            }break;                
            case SYS_ENERGY:         // 设置电源阈值
            {
                Key_Set_TouchUpdate(&object_system_power_ui[lcd_ugui.SysCnt]); 
            }break;                
            case SYS_BEEP:          // 设置蜂鸣器
            {
                Key_Set_TouchUpdate(&object_system_beep_ui[lcd_ugui.SysCnt]); 
            }break;            
            case SYS_ALARM_VPT:     //设置告警阈值
            {
                Key_Set_TouchUpdate(&object_system_alarm_ui[lcd_ugui.SysCnt]); 
            }break;
            case SYS_CTRL:          // 控制接口
            {
                Key_Set_TouchUpdate(&object_system_ctrl_ui[lcd_ugui.SysCnt]); 
            }break;                
            case SYS_INFO:          // 固件信息
            {
                Key_Set_TouchUpdate(&object_system_info_ui[lcd_ugui.SysCnt]); 
            }break; 
            case SYS_IS_SAVE:       // 提示是否保存 
            {
                Key_Set_TouchUpdate(&object_system_is_save_ui[lcd_ugui.SysCnt]); 
            }break;              
        }
        UG_Update_time_Set(0);
        lcd_ugui.DefaultDispCnt = DefaultDispTime; 
    }
   else if(keydis.KeyStatus == LONG_ENTER)     //长按
   {
       Beep_Activate(1,2);
       lcd_ugui.DefaultDispCnt = DefaultDispTime; //定时返回主页面
//      lcd_ugui.FuncID = ShuntControlDisp;
   }
   keydis.KeyStatus = NONE_ENTER;         //处理完毕
}


//Key_ADD_Parameter  按键 加号处理事件
void Key_ADD_SUD_Parameter(uint8_t key_id)
{
    uint16_t value_min,value_max ;  //数据最大值/最小值
    if(keydis.KeyStatus == SHORT_ENTER)
    {
        if( keydis.PressStatus == false )
        {   //按下来的时候
            if( key_id ){
                keydis.UpCnt++;     //加号计数
            }else{
                keydis.DnCnt++;     //减号计数
            }
        }
        switch(lcd_ugui.FuncID)
        { 
            case BIOS_UI :             //开机界面
            { 

            }break;     

            case SELF_TEST :         //自检参数设置
            {

            }break;
            case MAIN_UI :             //主界面
            {

            }break;
            case SYS_MENU  :          //系统参数设置
            {
                //选择功能                  //弹起
                if( keydis.PressStatus == false )
                {    //按下
                     lcd_ugui.SysCnt = Feisuo_process_Return(0,SYSTEM_MAX_OBJECTS-1,lcd_ugui.SysCnt);
                     window_system_ui_select(lcd_ugui.SysCnt);
                }
            }break; 
            case ALARM_UI :          //告警
            {

            }break;
            
            case SYS_UART:          // 设置串口参数
            {
                if( keydis.PressStatus == false )
                {    //按下
                    if( lcd_ugui.SysNextFlg == 0){
                        //选择 功能
                        lcd_ugui.SysCnt = Feisuo_process_Return(0,SYSTEM_UART_MAX_OBJECTS-1,lcd_ugui.SysCnt);
                        UG_Window_SYS_UART_Updata(0,lcd_ugui.SysCnt);
                    }
                    else if (lcd_ugui.SysNextFlg  == 1)
                    {
                        //数据 加/减 功能
                        UG_Window_System_UART_ADD_SUD(&lcd_ugui);
                    } 
                }
            }break;                
            case SYS_ENERGY:         // 电源能量
            {
                if( keydis.PressStatus == false )
                {                      
                     //数据 加/减 功能
                     UG_Window_System_Power_ADD_SUD(&lcd_ugui);
                }
            }break;                
            case SYS_BEEP:          // 设置蜂鸣器
            {
                if( keydis.PressStatus == false )
                {    //按下
                    if( lcd_ugui.SysNextFlg == 0){
                        //选择 功能
                        lcd_ugui.SysCnt = Feisuo_process_Return(0,SYSTEM_BEEP_MAX_OBJECTS-1,lcd_ugui.SysCnt);
                        UG_Window_System_Beep_Updata(0,lcd_ugui.SysCnt);
                    }
                    else if (lcd_ugui.SysNextFlg  == 1)
                    {
                        //数据 加/减 功能
                        UG_Window_System_Beep_ADD_SUD(&lcd_ugui);
                    }
                }
            }break;            
            case SYS_ALARM_VPT:    //设置告警阈值
            {
                if( keydis.PressStatus == false  )
                {    //按下
                    if( lcd_ugui.SysNextFlg == 0){
                        //选择 功能
                        value_min = 0;value_max = SYSTEM_ALARM_MAX_OBJECTS-1;
                        lcd_ugui.SysCnt = Feisuo_process_Return(value_min,value_max,lcd_ugui.SysCnt);
                        UG_Window_System_Alarm_Updata(0,lcd_ugui.SysCnt);
                    }
                    else if (lcd_ugui.SysNextFlg  == 1)
                    {
                        //数据 加/减 功能
                        UG_Window_System_Alarm_ADD_SUD(&lcd_ugui);
                    }
                }
            }break;
            case SYS_CTRL:          // 控制接口
            {
                if( keydis.PressStatus == false )
                {    //按下
                    if( lcd_ugui.SysNextFlg == 0){
                        //选择 功能
                        value_min = 0;value_max = SYSTEM_CTRL_MAX_OBJECTS-1;
                        lcd_ugui.SysCnt = Feisuo_process_Return(value_min,value_max,lcd_ugui.SysCnt);
                        UG_Window_System_Ctrl_Updata(0,lcd_ugui.SysCnt);
                    }
                    else if (lcd_ugui.SysNextFlg  == 1)
                    {
                        //数据 加/减 功能
                        UG_Window_System_Ctrl_ADD_SUD(&lcd_ugui);
                    }
                }
            }break;                
            case SYS_INFO:          // 固件信息
            {

            }break;
            case SYS_IS_SAVE:       // 提示是否保存 
            {
                lcd_ugui.SysCnt = Feisuo_process_Return(0,SYSTEM_SAVE_MAX_OBJECTS-1,lcd_ugui.SysCnt);
                UG_Window_SYS_UART_Updata(0,0);
                window_system_is_save_ui_select(lcd_ugui.SysCnt);
               
            }break;  
        }
        
        UG_Update_time_Set(2);
        lcd_ugui.DefaultDispCnt = DefaultDispTime; 
    }
   else if(keydis.KeyStatus == LONG_ENTER)      //长按
   {
        if( keydis.PressStatus == false )
        {   //按下来的时候
            if( key_id ){
                keydis.UpCnt+=10;     //加号计数
            }else{
                keydis.DnCnt+=10;     //减号计数
            }
            switch(lcd_ugui.FuncID)
            { 
                case SYS_BEEP:          // 设置蜂鸣器
                {
                    if (lcd_ugui.SysNextFlg  == 1)
                    {
                        //数据 加/减 功能
                        UG_Window_System_Beep_ADD_SUD(&lcd_ugui);
                    }
                }break;                 
                case SYS_ALARM_VPT:    //设置告警阈值
                {
                    //按下
                    if (lcd_ugui.SysNextFlg  == 1)
                    {
                        //数据 加/减 功能
                        UG_Window_System_Alarm_ADD_SUD(&lcd_ugui);
                    }
                }break;
           } 
       }        
       lcd_ugui.DefaultDispCnt = DefaultDispTime;
//      lcd_ugui.FuncID = ShuntControlDisp;
   }
   keydis.KeyStatus = NONE_ENTER;               //处理完毕
}
//Key_Return_Parameter  按键 返回 处理事件
void Key_Return_Parameter(void)
{

    if(keydis.KeyStatus == SHORT_ENTER && ( keydis.PressStatus == 0 ) )
    {
        switch(lcd_ugui.FuncID)
        { 
            case BIOS_UI :             //开机界面
            { 

            }break;     

            case SELF_TEST :         //自检参数设置
            {

            }break;
            case MAIN_UI :         //主界面
            {

            }break;
            case SYS_MENU  :        //系统参数设置
            {
                if( keydis.PressStatus == false  )
                {   
                    //弹起   返回上一个界面 
                    lcd_ugui.SysNextFlg = 0;
                    lcd_ugui.SysNextCnt = 0;
                    lcd_ugui.SysCnt = 0;
                    lcd_ugui.FuncID = MAIN_UI;
                    UG_WindowShow(&window_main_ui);
                }
            }break; 
            case ALARM_UI :          //告警
            {
                //弹起   返回自检界面 
                lcd_ugui.SysNextFlg = 0;
                lcd_ugui.SysNextCnt = 0;
                lcd_ugui.SysCnt = 0;
                lcd_ugui.FuncID = SELF_TEST;
                UG_WindowShow(&window_self_test);
            }break;
            
            case SYS_UART:          // 设置串口参数
            {
                Key_Return_is_save(&window_system_uart_ui,SYS_UART);
                //退出设置选择 
            }break;                
            case SYS_ENERGY:         // 设置电源阈值
            {
                Key_Return_is_save(&window_system_power_ui,SYS_ENERGY);
            }break;                
            case SYS_BEEP:          // 设置蜂鸣器
            {
                Key_Return_is_save(&window_system_beep_ui,SYS_BEEP);
            }break;            
            case SYS_ALARM_VPT:    //设置告警阈值
            {
                Key_Return_is_save(&window_system_alarm_ui,SYS_ALARM_VPT);
            }break;
            case SYS_CTRL:          // 控制接口
            {
                Key_Return_is_save(&window_system_ctrl_ui,SYS_CTRL);
            }break;                
            case SYS_INFO:          // 固件信息
            {
                Key_Return_is_save(&window_system_info_ui,SYS_INFO);
            }break;
            case SYS_IS_SAVE:       // 提示是否保存 
            {
                //弹起   返回上一个界面 
                lcd_ugui.SysNextFlg = 0;
                lcd_ugui.SysNextCnt = 0;
                lcd_ugui.SysCnt = 0;
                lcd_ugui.FuncID = SYS_MENU;
                //恢复原来数值。
                uint16_t * eprom = (uint16_t * )&lcd_ugui_Param;
                Eeprom_Read(FLASH_FIRMWARE_START,eprom,sizeof(lcd_ugui_Param)/2);
                
                window_system_ui_select(lcd_ugui.SysCnt);  //更新界面
                UG_WindowShow(&window_system_ui);
            }break;  
        }
  
        lcd_ugui.DefaultDispCnt = DefaultDispTime; 
    }
    else if(keydis.KeyStatus == LONG_ENTER)     //长按
    {
        lcd_ugui.DefaultDispCnt = DefaultDispTime; 
        UG_WindowShow(&window_system_ui);        //定时返回主页面          
    }
   UG_Update_time_Set(2);
   keydis.KeyStatus = NONE_ENTER;               //处理完毕
}

/*****************************************************************************
Function name : uGui_KEY_Dispose
Description: 控制操作处理
Input: NONE
Return: NONE
Notes:
******************************************************************************/
void  uGui_KEY_Dispose(void)
{

    uGui_KEY_SCAN();                    //扫描tm1638 按键数值
    
    if ((keydis.FirPre == true) && (keydis.ProEvent == true))
    {   
        //发生按键数据触发事件  
        switch(keydis.KeyVal)
        {   
            case Key_Set:                   //(0x0004)   //设置按键
                Key_Set_Parameter();
            break;
            case Key_Return:                //(0x0040)   //返回按键
                 Key_Return_Parameter();
            break;                               
            case Key_ADD:                   //(0x0002)   //加号按键 （+）
                  Key_ADD_SUD_Parameter(1);
            break;       
            case Key_SUD:                   //(0x0020)   //减号按键 （-）:
                  Key_ADD_SUD_Parameter(0);
            break;                               
            case Key_BLOOP:                 //(0x0001)   //消音按键
                 Beep_clear();  
            break;    
            case Key_TEST:                  //(0x0010)   //测试按键
                IM6103_Test_LeakCurt_handle();
                Beep_Activate(3,10);
            break;
            default:
            break;
        }
        if(keydis.PressStatus == false) {
            //完成1按下---->>>2抬起:的步骤才清除标志位
            keydis.ProEvent = false; 
            keydis.FirPre = false;
            keydis.KeyVal = 0;
            Beep_Activate(1,1);
        }
    }    
}
//key_led_handle  扫描按键+led灯事件
void key_led_handle(void)
{
    static uint8_t run_time = 0; 
    //定时扫描按键状态
    if( keytime > 20 )
    {       
        LedValue.bit.power = 1;  //电源灯

        if( run_time == 0 ){
           LedValue.bit.run = 1;     //运行灯
           run_time = 50; 
        }else{
           run_time --;
           if( run_time < 25 ){
              LedValue.bit.run = 0;  //运行灯
           }            
        }
        LedValue.bit.relays = relay_state;  //继电器状态指示
         //显示led灯
        //TM1638_Digital_LED_SET(0x01<<(i%16)); i++;   //测试
        TM1638_Digital_LED_SET(LedValue.HEX_16);
        keytime  = 0;
    }
    
    uGui_KEY_Dispose();
    
//    if( Update_disp_flg )
//    {   
//        //刷新led指示灯状态
//        Update_disp_flg = 0;
//        UpdateDisp();
//    }
}

